package com.shujia.sql

import org.apache.spark.sql.{DataFrame, SaveMode, SparkSession}

object Demo02SourceAPI {
  def main(args: Array[String]): Unit = {
    // SparkSQL提供的常见的Source
    val spark: SparkSession = SparkSession
      .builder()
      .appName("Demo02SourceAPI")
      .master("local")
      .getOrCreate()

    // 1、读取文本文件 csv
    val stuDF: DataFrame = spark
      .read
      .format("csv")
      .option("sep", ",")
      .schema("id Int,name String,age Int,gender String,clazz String")
      .load("Spark/data/students.txt")

    // 保存数据
    // SaveMode.Overwrite 指定写入的模式为覆盖模式
    stuDF.write.format("json").mode(SaveMode.Overwrite).save("Spark/data/stu/json")
    stuDF.write.format("parquet").mode(SaveMode.Overwrite).save("Spark/data/stu/parquet")
    stuDF.write.format("orc").mode(SaveMode.Overwrite).save("Spark/data/stu/orc")
    stuDF
      .write
      .format("jdbc")
      .option("url", "jdbc:mysql://master:3306/student?useSSL=false")
      .option("dbtable", "student_df")
      .option("user", "root")
      .option("password", "123456")
      .mode(SaveMode.Overwrite) // 会覆盖原有的表 并且表结构会发生变化
      .save()

    // parquet、json、orc自带结构 所以在读取时不需要指定schema

    // 空间占用: json > txt > parquet > orc

    // 2、读取json格式的数据
    spark
      .read
      .format("json")
      .load("Spark/data/stu/json")
      .show()

    // 3、读取parquet格式的数据
    spark
      .read
      .format("parquet")
      .load("Spark/data/stu/parquet")
      .show()

    // 4、读取orc格式的数据
    spark
      .read
      .format("orc")
      .load("Spark/data/stu/orc")
      .show()

    // 5、读取JDBC 例如：MySQL的数据
    spark
      .read
      .format("jdbc")
      .option("url", "jdbc:mysql://master:3306/student?useSSL=false")
      .option("dbtable", "student_ts")
      .option("user", "root")
      .option("password", "123456")
      .load()
      .show()


  }

}
